#pragma once
#include "Dispatcher.h"
#include <poll.h>
#include <vector>
#include "EventLoop.h"

class PollDispatcher : public Dispatcher { // 事件分发器: 包含6个函数指针, 具有检测功能
public:
	PollDispatcher(EventLoop* evLoop);
	virtual ~PollDispatcher();

	// 将[_curChannel.fd]添加到poll模型
	int add() override;
	// 将[_curChannel.fd]从poll模型中删除, 并释放_curChannel所属的TcpConnection
	int remove() override;
	// 修改poll模型中的[_curChannel.fd]的属性
	int modify() override;
	// 检测poll模型上的[_curChannel.fd]是否被激活(是否有就绪事件), 阻塞等待timeout秒, 并处理就绪事件
	int dispatch(int timeout = 2) override;
private:
	int _maxfd;					// poll()需要监视的文件描述符在fds的最大索引/下标
	struct pollfd* _fds;		// poll模型维护的pollfd数组
	const int _capacity = 1024; // pollfd数组的容量
};